//
//  OAuthViewController.swift
//  weibobbaj
//
//  Created by Tiffany宝 on 16/4/18.
//  Copyright © 2016年 Tiffany. All rights reserved.
//

import UIKit
import SVProgressHUD

// -----*** 把属性变成全局的 ***-----
let appkey = 2823118306
let secret = "cf6ec0b62260229019104f2050a40dd9"
let redirect_uri = "http://www.baidu.com/"

class OAuthViewController: UIViewController,UIWebViewDelegate {
    
    /*
    App Key：2823118306
    App Secret：cf6ec0b62260229019104f2050a40dd9
    url:https://api.weibo.com/oauth2/authorize?client_id=2823118306&redirect_uri=http://www.baidu.com
    */
    
    
    let webView: UIWebView = UIWebView()
    
    override func loadView() {
        
        view = webView
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
//        纯代码开发中,所有的控制器需要指定颜色
        view.backgroundColor = UIColor.whiteColor()
        
        navigationItem.leftBarButtonItem = UIBarButtonItem(title: "返回", style: .Plain, target: self, action: "didClickReturnButton")
        
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "自动填充", style: .Plain, target: self, action: "didClickFillButton")
        
        title = "宝宝爱酱weico登录界面"
        
        webView.loadRequest(NSURLRequest(URL: oauthURL))
        
        //设置 webView 为 OAuthViewController 的代理
        webView.delegate = self
        
    }

    @objc private func didClickReturnButton(){
        
        //dismiss 控制器
        dismissViewControllerAnimated(true, completion: nil)
        
        SVProgressHUD.dismiss()
    }
    
    @objc private func didClickFillButton(){
        
        //document.getElementById('userId').value = 'wdtchxh@yeah.net';
        //document.getElementById('passwd').value = 'weibocshxh'
        
        //  2个 Javascript 语句之间需要用 ";" 连接
        let js = "document.getElementById('userId').value = 'wdtchxh@yeah.net';" + "document.getElementById('passwd').value = 'weibocshxh'"
        
        // **** webView 执行 Javascript ****
        webView.stringByEvaluatingJavaScriptFromString(js)

    }
}

extension OAuthViewController{
    
    //    func oauthURL() -> NSURL{
    
    //用计算型属性 代替 func
    var oauthURL: NSURL{
        
        let url: String = "https://api.weibo.com/oauth2/authorize?client_id=\(appkey)&redirect_uri=\(redirect_uri)"
        
        return NSURL(string: url)!
    }
}

// MARK: - 专门用来实现 WebView 的代理方法
// MARK: - 请求授权
extension OAuthViewController{
    
    //开始加载
    func webViewDidStartLoad(webView: UIWebView) {
        
        SVProgressHUD.show()
    }
    
    //结束加载
    func webViewDidFinishLoad(webView: UIWebView) {
        
        SVProgressHUD.dismiss()
    }

    // 当webView将要加载一个request 的时候,就会调用一下这个方法,来询问一下是否要去加载这个request,如果该方法返回 false,就代表不去加载该request
    func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
        
        print(request)
        
//        print("----\(request.URL)")
//        
//        print("====\(request.URL?.absoluteString)")
        
        //目的是拿到回调地址后面的授权码:即 code =
        //URL: https://m.baidu.com/?code=d1529a634d2b5c4769042a40737c2a0a&from=844b&vit=fps
        guard let requestUrl = request.URL else{
            
            return false
        }
        
        if requestUrl.absoluteString.hasPrefix(redirect_uri){
            
            //Optional("code=26c2fba0a6c930d9d498994bd7b11205")
            print(requestUrl.query)
            
            // URL.query 拿到的就是 URL?后面的字符串
//            let query = requestUrl.query
//            //进行字符串的截取
//            
//            let code =  query?.substringFromIndex("code=".endIndex)
//            
//            print(code)
//            
//            //获取授权
//            loadAccessToken(code ?? "")
            
            //*********对比以上的方法 且 query 返回的字段为 "code=" ---- 因为取消授权会返回 "error_uri="********
//            requestUrl.query?.containsString("code=")
            if let query = requestUrl.query where query.containsString("code=") {
                
                 let code =  query.substringFromIndex("code=".endIndex)
                
                 print("code=\(code)")
                
                //获取授权---通过网络请求传递参数后获取数据(主要为了获取 Access_Token )

//                UserAccountViewModel.finish
                
                UserAccountViewModel.sharedViewModel.loadAccessToken(code, finished: { (isSuccess) -> () in
                    
                    if isSuccess{
                        
                        //关闭当前界面
                       self.dismissViewControllerAnimated(false, completion: { () -> Void in
                        
                            // 以后在开发过程中，尽量把切换根控制器的代码统一到一个地方
                            //切换到欢迎控制器
//                            UIApplication.sharedApplication().keyWindow?.rootViewController = WelcomeViewController()
                        
                            NSNotificationCenter.defaultCenter().postNotificationName(XHChangeRootViewNotification, object: nil)
                        })
                        
                        
                    }else{
                        
                        //给出一个友好的提示:失败
                        print("登录失败")
                        SVProgressHUD.showErrorWithStatus("登录失败")
                        
                    }
                    
                     // 代表真正的登录成功 -->
                })
            }
     
            return false
            
        }
        return true
    }
    
//    private func loadAccessToken(code:String){
//        
//        /*
//        client_id	true	string	申请应用时分配的AppKey。
//        client_secret	true	string	申请应用时分配的AppSecret。
//        grant_type	true	string	请求的类型，填写authorization_code
//        
//        grant_type为authorization_code时
//        必选	类型及范围	说明
//        code	true	string	调用authorize获得的code值。
//        redirect_uri	true	string	回调地址，需需与注册应用里的回调地址一致。
//        */
//        
//        let urlString = "https://api.weibo.com/oauth2/access_token"
//        let parameters = [
//            "client_id":appkey,
//            "client_secret":secret,
//            "grant_type":"authorization_code",
//            "code":code,
//            "redirect_uri":redirect_uri]
//        
//        NetworkTools.sharedTools.request(RequestMethod.POST, urlString: urlString, parameters: parameters) { (responseObject, error) -> Void in
//            
//            if error != nil{
//                //说明有错误
//                print(error)
//                return
//            }
//            print("请求成功：\(responseObject)")
//            
//            // 如果 as 是写在 if let 或者 guard 里面，都使用 as? ---------- as? 的第一种使用场景
//            guard let dict = responseObject as? [String: AnyObject] else{
//                print("后台返回数据的格式不对")
//                return
//            }
//            /*
//            Optional({
//            "access_token" = "2.00J1338GOCWDFD53a90e1984GZvx9E";
//            "expires_in" = 157679999;
//            "remind_in" = 157679999;
//            uid = 5901087097;
//            })
//            */
//            //获取授权后 返回的是字典 ----- 在公司里面开发的话，如果数据是字典，尽量要把其转成模型去使用
//            let account = UserAccountModel.init(dic: dict)
//            print(account)
//            
//            // accessToken 获取到了，获取个人信息
//            self.loadUserInfo(account)
//        }
//    }
//    
//    private func loadUserInfo(account:UserAccountModel){
//        
//        let urlStr = "https://api.weibo.com/2/users/show.json"
//        let parameters = [
//            "access_token":account.access_token ?? "",
//            "uid":account.uid ?? ""]
//        
//        NetworkTools.sharedTools.request( urlString: urlStr, parameters: parameters) { (responseObject, error) -> Void in
//            
//            if error != nil{
//                
//                print(error)
//                return
//            }
//            
//            print("请求成功：\(responseObject)")
//            
//            //判断 responseObject? 是否存在 ,存在即转成字典
//            guard let dict = responseObject as? [String: AnyObject] else{
//                print("后台返回数据的格式不对")
//                return
//            }
//            
//            // 要用到 字典中的 name 和 avatar_large 参数,所以一起保存为模型
//            // 如果等于前面是可选值的话，就使用 as? 如果是必选值，就使用 as! -------- as? 的第二种使用场景
//            account.name = dict["name"] as? String
//            account.avatar_large = dict["avatar_large"] as? String
//            
//            print("字典转模型的数据\(account)")
//            
//            //保存用户信息,为了下次用户进入app的时候不用登录
//            self.saveAccount(account)
//            
//            // 代表真正的登录成功 -->
//            // TODO: 关闭当前界面
//            // 切换控制器
//        }
//    }
//    
//    // MARK: - 归档
//    private func saveAccount(account:UserAccountModel){
//        
//        // 归档的路径 ： document路径 + 文件名
//        let path = (NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! as NSString ).stringByAppendingPathComponent("account.archiver")
//        
//        print(path)
//        
//        NSKeyedArchiver.archiveRootObject(account, toFile: path)
//        
//    }
//    
//    // MARK: - 解档 若路径不存在,返回nil ---- UserAccountModel?
//    private func decodeAccount() -> UserAccountModel?{
//        
//        //测试解档
//        let path = (NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! as NSString ).stringByAppendingPathComponent("account.archiver")
//        let result = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as? UserAccountModel
////        print(result)
//        return result
//    }
}


